home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / os20 / util / ntsc4ntsc.lha / NTSC4NTSC.mod < prev   
Text File  |  1992-10-11  |  16KB  |  456 lines

  1. (* ------------------------------------------------------------------------
  2.   :Program.       NTSC for NTSC
  3.   :Contents.      Get 60 Hz for NTSC screens
  4.   :Author.        Kai Bolay [kai]
  5.   :Address.       Snail-Mail:              E-Mail:
  6.   :Address.       Hoffmannstraße 168       UUCP: kai@amokle.adsp.sub.org
  7.   :Address.       D-7250 Leonberg 1        FIDO: 2:247/706.3
  8.   :History.       v1.0 [kai] 15-Aug-91 (started written history)
  9.   :History.       v1.1 [kai] 16-Aug-91 (bug fixes)
  10.   :History.       v1.2 [kai] 26-Sep-91 (+ improved stdHeight-handling)
  11.   :History.       v1.3 [kai] 19-Nov-91 (+ AutoScroll, force)
  12.   :History.       v1.4 [kai] 14-Dec-91 (+ tried to improve, no success)
  13.   :History.       v1.5 [kai] 19-Jan-92 (+ removed illegal writes)
  14.   :History.       v1.6 [kai] 24-Mar-92 (+ NEWLOOK for all screens)
  15.   :History.       v1.7 [kai] 10-Apr-92 (+ AutoScroll only if necessary)
  16.   :History.       v1.8 [kai] 25-Jun-92 (- FreeTagItem()-Bug/v39 fix)
  17.   :History.       v1.9 [kai] 12-Jul-92 (+ ModeNotAvailable() check)
  18.   :History.       v2.0 [kai] 11-Aug-92 (+ Promote)
  19.   :Copyright.     Freeware
  20.   :Language.      Oberon
  21.   :Translator.    AMIGA OBERON v2.42d
  22.   :Remark.        Thanks to Peter Cherna
  23.   :Remark.        Thanks to Franz Schwarz for telling me a possibility to
  24.   :Remark.        remove illegal writes to the TagList and a lot more...
  25.   :Remark.        NEWLOOK was inspired by Martin Berndt's TagScreens
  26.   :Usage.         STDPAL/S,STDNTSC/S,USEAUTO/S,FORCENTSC/S,NEWLOOK/S,PROMOTE/S
  27.   :Usage.         The first two options describe behaviour for StdHeight-
  28.   :Usage.         Screens. The third says use AutoScroll instead of PAL.
  29.   :Usage.         The forth always forces NTSC, the last enables the 2.0
  30.   :Usage.         look for all screens.
  31. ------------------------------------------------------------------------ *)
  32. MODULE NTSC4NTSC; (* $Debug- *)
  33. (* $IF SmallData *) Not possible (* $END *)
  34.  
  35. (* $OvflChk- $RangeChk- $StackChk- $NilChk- $ReturnChk- $CaseChk- *)
  36.  
  37. IMPORT
  38.   e: Exec, I: Intuition, g: Graphics, u: Utility, d: Dos, y: SYSTEM
  39.   (* $IF DoIt *) ,dio: DebugIo (* $END *);
  40.  
  41. CONST
  42.   OpenScreenOfs = -198;
  43.   OpenScreenTagsOfs = -612;
  44.   (* $IF DoIt *)
  45.   Version = "$VER: NTSC4NTSC v2.0 (11-Aug-92) by Kai Bolay (Debug)\r\n";
  46.   (* $ELSE *)
  47.   Version = "$VER: NTSC4NTSC v2.0 (11-Aug-92) by Kai Bolay\r\n";
  48.   (* $END *)
  49.   Template = "STDPAL/S,STDNTSC/S,USEAUTO/S,FORCENTSC/S,NEWLOOK/S,PROMOTE/S";
  50.   STDPAL    = 0;
  51.   STDNTSC   = 1;
  52.   USEAUTO   = 2;
  53.   FORCENTSC = 3;
  54.   NEWLOOK   = 4;
  55.   PROMOTE   = 5;
  56.   NumOpts   = 6;
  57.   dblpalMonitorID = 0000A1000H; (* v39 *)
  58.   dblntscMonitorID = 000091000H; (* v39 *)
  59. TYPE
  60.   TagArrayPtr = UNTRACED POINTER TO ARRAY MAX (INTEGER) OF u.TagItem;
  61.   ExtNewScreenPtr = UNTRACED POINTER TO I.ExtNewScreen;
  62.   OpenScreenProc = PROCEDURE (newScreen{8}: ExtNewScreenPtr): I.ScreenPtr;
  63.   OpenScreenTagsProc = PROCEDURE (newScreen{8}: I.NewScreenPtr;
  64.                                   paraTagList{9}: TagArrayPtr): I.ScreenPtr;
  65. VAR
  66.   OldOpenScreen: OpenScreenProc;
  67.   OldOpenScreenTags: OpenScreenTagsProc;
  68.   OldNormRows: INTEGER;
  69.   OScanRect: g.Rectangle;
  70.   Opt: ARRAY NumOpts OF e.APTR;
  71.   RD: d.RDArgsPtr;
  72.   StdHeightMonitorID,PALMonitorID, NTSCMonitorID: LONGINT;
  73.  
  74. PROCEDURE NewOpenScreenTags* (newScreen{8}: I.NewScreenPtr;
  75.                               paraTagList{9}: TagArrayPtr): I.ScreenPtr;
  76. TYPE
  77.   PenArray = ARRAY 1 OF INTEGER;
  78. CONST
  79.   Pens = PenArray (-1);
  80.   ES = I.EasyStruct (y.SIZE (I.EasyStruct), LONGSET {}, y.ADR ("NTSC4NTSC"),
  81.   y.ADR ("Which Mode should be used for the\nscreen named \"%s\"?"),
  82.   y.ADR ("NTSC|PAL"));
  83.   MaxTags = 10;
  84.   saLikeWorkbench = I.saDummy + 00027H; (* v39 *)
  85. VAR
  86.   Base: I.IntuitionBasePtr;
  87.   TState, Tag, DisplayTag, TypeTag, ScrollTag: u.TagItemPtr;
  88.   Tags: ARRAY MaxTags OF u.TagItem;
  89.   DisplayID: LONGINT;
  90.   OScanRect: g.Rectangle;
  91.   Height: INTEGER;
  92.   Title: e.STRPTR;
  93.   DoScroll, ScrollMagic, Patch: BOOLEAN;
  94.   ListEnd: INTEGER;
  95.   tagList, argTagList: TagArrayPtr;
  96.   scrPtr: I.ScreenPtr;
  97.  
  98.   PROCEDURE GetMonitorID (ID: LONGINT): LONGINT;
  99.   BEGIN
  100.     (* $IF DoIt *)
  101.     dio.WriteString ("GetMonitorID: ");
  102.     dio.WriteHex (y.VAL (LONGINT, y.VAL (LONGSET, ID) *
  103.                          y.VAL (LONGSET, g.monitorIDMask)), 8); dio.WriteLn;
  104.     (* $END *)
  105.     RETURN y.VAL (LONGINT, y.VAL (LONGSET, ID) *
  106.                            y.VAL (LONGSET, g.monitorIDMask));
  107.   END GetMonitorID;
  108.  
  109.   PROCEDURE SetMonitorID (ID: LONGINT; Monitor: LONGINT): LONGINT;
  110.   BEGIN
  111.     (* $IF DoIt *)
  112.     dio.WriteString ("SetMonitorID: ");
  113.     dio.WriteHex (ID, 8); dio.WriteString (" -> ");
  114.     dio.WriteHex (y.VAL (LONGINT, y.VAL (LONGSET, ID) *
  115.         (- y.VAL (LONGSET, g.monitorIDMask))) + Monitor, 8); dio.WriteLn;
  116.     (* $END *)
  117.     RETURN y.VAL (LONGINT, y.VAL (LONGSET, ID) *
  118.                            (- y.VAL (LONGSET, g.monitorIDMask))) + Monitor;
  119.   END SetMonitorID;
  120.  
  121. (* $SaveRegs+ Prepare to work in other tasks *)
  122. BEGIN
  123.   Base := y.REG (14);
  124.  
  125.   (* $IF DoIt *)
  126.   dio.WriteString ("\nHi Folks!\n");
  127.   (* $END *)
  128.  
  129.   ListEnd := 0;
  130.   Height := I.stdScreenHeight;
  131.   ScrollMagic := TRUE; DoScroll := FALSE; Patch := TRUE;
  132.   Title := y.ADR ("");
  133.   DisplayTag := NIL; TypeTag := NIL; ScrollTag := NIL;
  134.  
  135.   IF paraTagList # NIL THEN
  136.     tagList := u.CloneTagItems (paraTagList^);
  137.     IF tagList = NIL THEN
  138.       (* $IF DoIt *)
  139.       dio.WriteString ("No Mem to clone!\n");
  140.       (* $END *)
  141.       y.SETREG (14, Base);
  142.       RETURN OldOpenScreenTags (newScreen, paraTagList);
  143.     END;
  144.   ELSE
  145.     tagList := NIL;
  146.   END;
  147.  
  148.   IF newScreen # NIL THEN
  149.     Height := newScreen.height;
  150.     Title := newScreen.defaultTitle;
  151.     (* knock out bad bits! *)
  152.     DisplayID := I.UIntToLong (y.VAL (INTEGER, newScreen.viewModes -
  153.   SET {g.sprites, g.genlockAudio, g.genLockVideo, g.extendedMode, g.vpHide}));
  154.  
  155.     (*
  156.     IF (newScreen.type * I.screenType # I.customScreen) AND
  157.        (newScreen.type * I.screenType # SET {I.publicScreen}) THEN
  158.       (* $IF DoIt *)
  159.       dio.WriteString ("Type: "); dio.WriteHex (y.VAL (INTEGER, newScreen.type), 4);
  160.       (* $END *)
  161.       newScreen.type := newScreen.type + I.customScreen;
  162.       (* $IF DoIt *)
  163.       dio.WriteString (" -> "); dio.WriteHex (y.VAL (INTEGER, newScreen.type), 4); dio.WriteLn;
  164.       (* $END *)
  165.     END;
  166.     *)
  167.  
  168.     (* $IF DoIt *)
  169.     dio.WriteString ("NewScreen gibbet:\n");
  170.     dio.WriteString ("Height: "); dio.WriteInt (Height, 4); dio.WriteLn;
  171.     dio.WriteString ("ViewModes: "); dio.WriteHex (y.VAL (INTEGER, newScreen.viewModes), 4); dio.WriteLn;
  172.     dio.WriteString ("DisplayID: "); dio.WriteHex (DisplayID, 8); dio.WriteLn;
  173.     (* $END *)
  174.   END; (* IF *)
  175.  
  176.   IF tagList # NIL THEN
  177.     TState := y.ADR (tagList^[0]);
  178.     LOOP
  179.       Tag := u.NextTagItem (TState);
  180.       IF Tag = NIL THEN EXIT END;
  181.       (* $IF DoIt *)
  182.       dio.WriteString ("Tag: "); dio.WriteHex (y.VAL (LONGINT, Tag.tag), 8);
  183.       dio.WriteString (" Data: "); dio.WriteHex (y.VAL (LONGINT, Tag.data), 8); dio.WriteLn;
  184.       (* $END *)
  185.       CASE y.VAL (LONGINT, Tag.tag) OF
  186.       | I.saDisplayID:   DisplayTag := Tag; DisplayID := Tag.data;
  187.       | I.saType:        TypeTag := Tag;
  188.       | I.saAutoScroll:  ScrollTag := Tag;
  189.       | I.saHeight:      Height := SHORT (y.VAL (LONGINT, Tag.data));
  190.       | I.saTitle:       Title := Tag.data;
  191.       | I.saOverscan:    ScrollMagic := FALSE;
  192.       | I.saDClip:       ScrollMagic := FALSE;
  193.       | saLikeWorkbench: Patch := (Tag.data # I.LTRUE);
  194.       ELSE
  195.       END;
  196.     END;
  197.     (* $IF DoIt *)
  198.     dio.WriteString ("TagList gibbet:\n");
  199.     dio.WriteString ("Height: "); dio.WriteInt (Height, 4); dio.WriteLn;
  200.     dio.WriteString ("DisplayID: "); dio.WriteHex (DisplayID, 8); dio.WriteLn;
  201.     (* $END *)
  202.   END;
  203.  
  204.   (* $IF DoIt *)
  205.   dio.WriteString ("The DisplayID: "); dio.WriteHex (DisplayID, 8); dio.WriteLn;
  206.   (* $END *)
  207.  
  208.   IF Patch THEN
  209.  
  210.     IF Opt[FORCENTSC] # 0 THEN
  211.       DisplayID := SetMonitorID (DisplayID, g.defaultMonitorID);
  212.     END;
  213.  
  214.     IF (GetMonitorID (DisplayID) = g.defaultMonitorID) AND
  215.        (I.QueryOverscan (SetMonitorID (DisplayID, NTSCMonitorID),
  216.                          OScanRect, I.oScanText) # 0) THEN
  217.       (* $IF DoIt *)
  218.       dio.WriteString ("Let's patch: ");
  219.       (* $END *)
  220.       IF Height = I.stdScreenHeight THEN
  221.         (* $IF DoIt *)
  222.         dio.WriteString ("Std-Height\n");
  223.         (* $END *)
  224.         IF StdHeightMonitorID = g.defaultMonitorID THEN
  225.           IF I.EasyRequest (NIL, y.ADR (ES), NIL, Title) = 1 THEN
  226.             DisplayID := SetMonitorID (DisplayID, NTSCMonitorID);
  227.           ELSE
  228.             DisplayID := SetMonitorID (DisplayID, PALMonitorID);
  229.           END;
  230.         ELSE
  231.           DisplayID := SetMonitorID (DisplayID, StdHeightMonitorID);
  232.         END;
  233.       ELSE
  234.         IF (Height <= OScanRect.maxY - OScanRect.minY + 1) AND (Opt[STDPAL] = 0) THEN
  235.           (* $IF DoIt *)
  236.           dio.WriteString ("NTSC\n");
  237.           (* $END *)
  238.           DisplayID := SetMonitorID (DisplayID, NTSCMonitorID);
  239.         ELSE
  240.           IF (Opt[USEAUTO] = 0) THEN
  241.             (* $IF DoIt *)
  242.             dio.WriteString ("PAL\n");
  243.             (* $END *)
  244.              DisplayID := SetMonitorID (DisplayID, PALMonitorID);
  245.           ELSE
  246.             DoScroll :=  NOT (Height <= OScanRect.maxY - OScanRect.minY + 1);
  247.             DisplayID := SetMonitorID (DisplayID, NTSCMonitorID);
  248.           END;
  249.         END;
  250.       END;
  251.     END;
  252.  
  253.     IF Opt[NEWLOOK] # 0 THEN
  254.       Tags[ListEnd].tag := I.saPens; Tags[ListEnd].data := y.ADR (Pens);
  255.       INC (ListEnd);
  256.   (*
  257.       Tags[ListEnd].tag := I.saFullPalette; Tags[ListEnd].data := I.LTRUE;
  258.       INC (ListEnd);
  259.   *)
  260.     END; (* IF *)
  261.  
  262.     IF DisplayTag # NIL THEN
  263.       (* $IF DoIt *)
  264.       dio.WriteString ("ab in den DispTag!\n");
  265.       (* $END *)
  266.       DisplayTag.data := DisplayID;
  267.     ELSE
  268.       Tags[ListEnd].tag := I.saDisplayID; Tags[ListEnd].data := DisplayID;
  269.       INC (ListEnd);
  270.     END;
  271.     IF DoScroll THEN
  272.       (* $IF DoIt *)
  273.       dio.WriteString ("Schkroll!!\n");
  274.       (* $END *)
  275.       IF (TypeTag = NIL) AND (ScrollTag = NIL) THEN
  276.         Tags[ListEnd].tag := I.saAutoScroll; Tags[ListEnd].data := I.LTRUE;
  277.         INC (ListEnd);
  278.       ELSE
  279.         IF TypeTag # NIL THEN
  280.           TypeTag.data := y.VAL (LONGINT, y.VAL (LONGSET, TypeTag.data) +
  281.                                           LONGSET {I.autoScroll});
  282.         END;
  283.         IF ScrollTag # NIL THEN
  284.           ScrollTag.data := I.LTRUE;
  285.         END;
  286.       END;
  287.       IF ScrollMagic THEN
  288.         Tags[ListEnd].tag := I.saOverscan; Tags[ListEnd].data := I.oScanText;
  289.         INC (ListEnd);
  290.       END;
  291.     END;
  292.   (* $IF DoIt *)
  293.   ELSE
  294.     dio.WriteString ("It's a WB!\n");
  295.   (* $END *)
  296.   END;
  297.  
  298.   IF ListEnd > 0 THEN
  299.     IF tagList = NIL THEN
  300.       (* $IF DoIt *)
  301.       dio.WriteString ("New Tags alone!\n");
  302.       (* $END *)
  303.       Tags[ListEnd].tag := u.done; Tags[ListEnd].data := 0;
  304.       INC (ListEnd);
  305.     ELSE
  306.       (* $IF DoIt *)
  307.       dio.WriteString ("New & old Tags!\n");
  308.       (* $END *)
  309.       Tags[ListEnd].tag := u.more; Tags[ListEnd].data := tagList;
  310.       INC (ListEnd);
  311.     END;
  312.     argTagList := y.ADR (Tags);
  313.   ELSE
  314.     (* $IF DoIt *)
  315.     dio.WriteString ("Old Tags alone!\n");
  316.     (* $END *)
  317.     argTagList := tagList;
  318.   END;
  319.  
  320.   (* $IF DoIt *)
  321.   d.Delay (3*50);
  322.   (* $END *)
  323.  
  324.   y.SETREG (14, Base);
  325.   scrPtr := OldOpenScreenTags (newScreen, argTagList);
  326.   IF tagList # NIL THEN
  327.     u.FreeTagItems (tagList^);
  328.   END;
  329.  
  330.   y.SETREG (14, Base);
  331.   RETURN scrPtr;
  332. END NewOpenScreenTags;
  333.  
  334. PROCEDURE NewOpenScreen* (newScreen{8}: ExtNewScreenPtr): I.ScreenPtr;
  335. VAR
  336.   Base: I.IntuitionBasePtr;
  337.   nScrPtr: I.NewScreenPtr;
  338.   scrPtr: I.ScreenPtr;
  339.  
  340. (* $SaveRegs+ Prepare to work in other tasks *)
  341. BEGIN
  342.   Base := y.REG (14);
  343.   (* $IF DoIt *)
  344.   dio.WriteString ("\nMäthschick (StdOpenScreen)!!!");
  345.   (* $END *)
  346.   (* Do the magic *)
  347.   IF (I.nsExtended IN newScreen.ns.type) THEN
  348.     nScrPtr := e.AllocVec (y.SIZE (I.NewScreen), LONGSET {});
  349.     IF nScrPtr = NIL THEN
  350.       y.SETREG (14, Base);
  351.       RETURN OldOpenScreen (newScreen);
  352.     END;
  353.     e.CopyMem (newScreen^, nScrPtr^, y.SIZE (I.NewScreen));
  354.     EXCL (nScrPtr.type, I.nsExtended);
  355.     y.SETREG (14, Base);
  356.     scrPtr := NewOpenScreenTags (nScrPtr,
  357.                                  y.VAL (TagArrayPtr, newScreen.extension));
  358.     e.FreeVec (nScrPtr);
  359.     y.SETREG (14, Base);
  360.     RETURN scrPtr;
  361.   ELSE
  362.     y.SETREG (14, Base);
  363.     RETURN NewOpenScreenTags (newScreen, NIL);
  364.   END;
  365. END NewOpenScreen;
  366.  
  367. BEGIN
  368.   (* $IF DoIt *)
  369.   dio.OpenIo;
  370.   dio.WriteString ("Jappadappaduuu!\n");
  371.   (* $END *)
  372.   y.SETREG (0, d.Write (d.Output (), Version[6], y.SIZE (Version)-6));
  373.   (* 2.04 should be :-) *)
  374.   IF I.int.libNode.version < 37 THEN
  375.     IF d.Output () # NIL THEN
  376.       y.SETREG (0, d.Write (d.Output (), "Sorry, I need OS 2.04!\n", 23));
  377.     END;
  378.     HALT (20);
  379.   END;
  380.  
  381.   Opt[STDPAL] := 0; Opt[STDNTSC] := 0; Opt[USEAUTO] := 0;
  382.   Opt[FORCENTSC] := 0; Opt[NEWLOOK] := 0; Opt[PROMOTE] := 0;
  383.  
  384.   RD := d.ReadArgs (Template, Opt, NIL);
  385.   IF RD = NIL THEN
  386.     d.PrintF ("Usage: %s\n", y.ADR (Template));
  387.     HALT (20);
  388.   END; (* IF *)
  389.   IF (Opt[FORCENTSC] # 0) THEN
  390.     Opt[STDNTSC] := -1;
  391.     Opt[USEAUTO] := -1;
  392.   END;
  393.   IF (Opt[STDPAL] # 0) AND (Opt[STDNTSC] # 0) THEN
  394.     y.SETREG (0, d.PutStr ("Sorry, PAL & NTSC together is not possible!\n"));
  395.     HALT (20);
  396.   END;
  397.   IF Opt[PROMOTE] # 0 THEN
  398.     IF I.int.libNode.version < 39 THEN
  399.       y.SETREG (0, d.PutStr ("Promotion needs v39!\n"));
  400.       HALT (20);
  401.     END;
  402.     PALMonitorID := dblpalMonitorID;
  403.     NTSCMonitorID := dblntscMonitorID;
  404.   ELSE
  405.     PALMonitorID := g.palMonitorID;
  406.     NTSCMonitorID := g.ntscMonitorID;
  407.   END;
  408.   IF Opt[STDPAL] # 0 THEN StdHeightMonitorID := PALMonitorID END;
  409.   IF Opt[STDNTSC] # 0 THEN StdHeightMonitorID := NTSCMonitorID END;
  410.  
  411.   (* NTSC & PAL available? *)
  412.   IF (g.FindDisplayInfo (PALMonitorID) = NIL) OR
  413.      (g.ModeNotAvailable (PALMonitorID) # 0) OR
  414.      (g.FindDisplayInfo (NTSCMonitorID) = NIL) OR
  415.      (g.ModeNotAvailable (NTSCMonitorID) # 0) THEN
  416.     y.SETREG (0, d.PutStr ("Sorry, PAL & NTSC must be available!\n"));
  417.     HALT (20);
  418.   END;
  419.  
  420.   (* Patch *)
  421.   e.Forbid;
  422.   OldOpenScreen := y.VAL (OpenScreenProc,
  423.                           e.SetFunction (I.int, OpenScreenOfs,
  424.                                          y.VAL (e.PROC, NewOpenScreen)));
  425.   OldOpenScreenTags := y.VAL (OpenScreenTagsProc,
  426.                               e.SetFunction (I.int, OpenScreenTagsOfs,
  427.                                              y.VAL (e.PROC, NewOpenScreenTags)));
  428.   e.Permit;
  429.  
  430.   (* Wait for Break *)
  431.   y.SETREG (0, e.Wait (LONGSET {d.ctrlC})); (* ... *)
  432.  
  433.   (* Unpatch *)
  434.   e.Forbid;
  435.   OldOpenScreen := y.VAL (OpenScreenProc,
  436.                           e.SetFunction (I.int, OpenScreenOfs,
  437.                                          y.VAL (e.PROC, OldOpenScreen)));
  438.   OldOpenScreenTags := y.VAL (OpenScreenTagsProc,
  439.                               e.SetFunction (I.int, OpenScreenTagsOfs,
  440.                                              y.VAL (e.PROC, OldOpenScreenTags)));
  441.   e.Permit;
  442.   IF (y.VAL (y.ADDRESS, OldOpenScreen)     # y.VAL (y.ADDRESS, NewOpenScreen)    ) OR
  443.      (y.VAL (y.ADDRESS, OldOpenScreenTags) # y.VAL (y.ADDRESS, NewOpenScreenTags)) THEN
  444.     IF I.DisplayAlert (I.recoveryAlert,
  445.                        "\x00\x10\x10Someone else patched too. Safety cannot be guarateed, please reboot!\o\n\x00\x10\x1A     -> Reboot <-                           -> Hope and pray <-     \o\o",
  446.                        40) THEN
  447.       e.ColdReboot;
  448.     END;
  449.   END;
  450.   (* $IF DoIt *)
  451.   dio.CloseIo;
  452.   (* $END *)
  453. CLOSE
  454.   IF RD # NIL THEN d.FreeArgs (RD); RD := NIL END;
  455. END NTSC4NTSC.
  456.